package com.song.aspect;

import com.song.annotation.AutoFill;
import com.song.constant.AutoFillConstant;
import com.song.context.BaseContext;
import com.song.entity.Category;
import com.song.entity.Employee;
import com.song.enumeration.SqlOperationType;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.time.LocalDateTime;

@Aspect
@Component
@Slf4j
public class AutoFillAspect {
    // 定义切点：匹配* com.song.mapper.*.*(..)包下所有类的mapper方法
    @Pointcut("execution(* com.song.mapper.*.*(..)) && @annotation(com.song.annotation.AutoFill)")
    public void autoFillPointCut() {}

   @Before("autoFillPointCut()")
    public void autoFill(JoinPoint joinPoint){
       log.info("开始进行数据填充");
       // 获取方法上的 AutoFill 注解 value值 和 方法参数
       //1.获取注解值
       MethodSignature signature = (MethodSignature) joinPoint.getSignature();
       AutoFill autoFill = signature.getMethod().getAnnotation(AutoFill.class);
       //2.获取方法参数
        Object[] args = joinPoint.getArgs();
       log.info("sql操作类型：{}", autoFill.value());
       log.info("方法参数：{}", joinPoint.getArgs());
       if(args == null || args.length == 0){
           return;
       }
       // TODO: 根据 operationType 执行不同字段填充逻辑
       if(autoFill.value() == SqlOperationType.INSERT){
         try {
             // 通过反射获取参数对象的set方法
             Method setCreateTime = args[0].getClass().getMethod(AutoFillConstant.SET_CREATE_TIME, LocalDateTime.class);
             Method setUpdateTime = args[0].getClass().getMethod(AutoFillConstant.SET_UPDATE_TIME, LocalDateTime.class);
             Method setCreateUser = args[0].getClass().getMethod(AutoFillConstant.SET_CREATE_USER, Long.class);
             Method setUpdateUser = args[0].getClass().getMethod(AutoFillConstant.SET_UPDATE_USER, Long.class);

             // 为对应的参数对象赋值
             setCreateTime.invoke(args[0], LocalDateTime.now());
             setUpdateTime.invoke(args[0], LocalDateTime.now());
             setCreateUser.invoke(args[0], BaseContext.getCurrentId());
             setUpdateUser.invoke(args[0], BaseContext.getCurrentId());
         } catch (Exception e) {
            log.error(e.getMessage());
         }
       }else {
          try {
              // 通过反射获取参数对象的set方法
              Method setUpdateTime = args[0].getClass().getMethod(AutoFillConstant.SET_UPDATE_TIME, LocalDateTime.class);
              Method setUpdateUser = args[0].getClass().getMethod(AutoFillConstant.SET_UPDATE_USER, Long.class);

              //为对应的参数对象赋值
              setUpdateTime.invoke(args[0], LocalDateTime.now());
              setUpdateUser.invoke(args[0], BaseContext.getCurrentId());
          } catch (Exception e) {
             log.error(e.getMessage());
          }
       }
    }
}
